package thread;

//线程的五种状态：
//1.新建状态：线程刚创建，但是还没有调用start方法，此时线程处于新建状态
//2.就绪状态：线程已经调用了start方法，但是还没有抢到CPU执行权，此时线程处于就绪状态
//3.运行状态：线程已经抢到CPU执行权，此时线程处于运行状态
//4.死亡状态：
           //正常死亡：线程运行结束
          //异常死亡：线程运行时抛出异常，导致线程死亡
//5.阻塞状态：线程运行时，因为某些原因（如等待、休眠、同步）被阻塞，此时线程处于阻塞状态
//状态切换：
        //运行状态 --> 死亡状态

        //情况1.运行状态 -- run()执行完毕 --> 死亡状态         正常死亡
        //情况2.运行状态 -- run()执行中有bug，抛出异常 --> 死亡状态    异常死亡
        //情况3.运行状态 -- 执行interrupt(),stop() --> 死亡状态    自杀

        //就绪状态 -- 抢到CPU执行权 -- 运行状态
        //运行状态 -- 自动失去CPU执行权【yield()方法】 -- 就绪状态

        //运行状态 --> 阻塞状态
        //运行状态 -- 睡眠【sleep(毫秒值)】 -- 阻塞状态   短暂暂停，时间到后恢复运行
        //运行状态 -- 等待【wait()】 -- 阻塞状态         线程等待，等待被唤醒
        //运行状态 -- 等待合并【join()】 -- 阻塞状态      等待其他线程执行完毕再执行
        //运行状态 -- 同步锁【synchronized】 -- 阻塞状态 线程等待锁释放
        //运行状态 -- 等待IO【IO流】 -- 阻塞状态         线程等待IO完成

        //说明：一个运行中的线程一旦阻塞，就会自动释放CPU执行权
        //阻塞状态 -- 就绪状态

        //阻塞状态 -- 睡眠时间结束 -- 就绪状态
        //阻塞状态 -- 线程被唤醒【notyfy(),notifyAll()】 -- 就绪状态
        //阻塞状态 -- 其他线程执行完毕 -- 就绪状态
        //阻塞状态 -- 同步锁释放 -- 就绪状态
        //阻塞状态 -- IO完成 -- 就绪状态

public class Test {

    public static void main(String[] args) {


        Runnable r = new Runnable() {//创建Runnable接口的实现类
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    try {
                        Thread.sleep(1000);//线程睡眠1秒
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + ":" + i);//输出线程名及i的值
                }
            }
        };
        //创建线程
        Thread t1 = new Thread(r, "线程1");
        t1.start();
        Thread t2 = new Thread(() -> {
            for (int i = 10; i <= 20; i++) {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + ":" +i);
            }
        }, "线程2");
        t2.start();
    }
}
